package xyz.fivefaith.tool.common.util;

import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;

import org.apache.commons.lang3.ObjectUtils;

import xyz.fivefaith.tool.common.excetion.ServiceException;
import xyz.fivefaith.tool.common.function.BiBranchHandle;
import xyz.fivefaith.tool.common.function.BiBranchSupplierHandle;
import xyz.fivefaith.tool.common.function.PresentOrElseHandler;
import xyz.fivefaith.tool.common.function.SingleBranchHandle;
import xyz.fivefaith.tool.common.function.ThrowExceptionConsumer;
import xyz.fivefaith.tool.common.function.ThrowMsgExceptionConsumer;

/**
 * 函数工具类
 *
 * @author zhaoanchi
 * @version 1.0
 * @since 2023-05-29 14:16
 */
@Slf4j
@UtilityClass
public class FunctionUtil {

    /* ****************************** 分支判断 ****************************** */
    /* ****************************** 分支判断 ****************************** */

    /**
     * @param flag 条件
     * @return 异常Consumer
     */
    public static ThrowMsgExceptionConsumer throwMsgIsTrue(boolean flag) {
        return (errorMessage -> {
            if (flag) {
                throw new ServiceException(errorMessage);
            }
        });
    }

    /**
     * @param flag 条件
     * @return 异常Consumer
     */
    public static ThrowExceptionConsumer throwIsTrue(boolean flag) {
        return (e -> {
            if (flag) {
                throw e;
            }
        });
    }

    /**
     * 参数为true或false时，分别进行不同的操作
     *
     * @param flag 条件
     * @return 双分支操作
     */
    public static BiBranchHandle isTrueOrFalse(boolean flag) {
        return ((trueHandle, falseHandle) -> {
            if (flag) {
                trueHandle.run();
            } else {
                falseHandle.run();
            }
        });
    }

    /**
     * 参数为true或false时，分别进行不同的操作
     *
     * @param flag 条件
     * @return 双分支操作
     */
    public static <T> BiBranchSupplierHandle<T> isTrueOrFalseReValue(boolean flag) {
        return ((trueHandle, falseHandle) -> {
            if (flag) {
                return trueHandle.get();
            } else {
                return falseHandle.get();
            }
        });
    }

    /**
     * 参数为true时，进行操作
     *
     * @param flag 条件
     * @return 单分支操作
     */
    public static SingleBranchHandle isTrue(boolean flag) {
        return trueHandle -> {
            if (flag) {
                trueHandle.run();
            }
        };
    }

    /**
     * 参数为空或不为空时，分别进行不同的操作
     *
     * @param t 参数
     * @return 空值与非空值分支处理
     */
    public static <T> PresentOrElseHandler<T> isBlankOrNoBlank(T t) {
        return (consumer, runnable) -> {
            if (ObjectUtils.isEmpty(t)) {
                runnable.run();
            } else {
                consumer.accept(t);
            }
        };
    }
}
